/**
 定义 TypeScript 的所有原始标准类型。
 */
export type Primitive = null | undefined | string | number | boolean | symbol | bigint;

/**
 将类型 T 中的指定的属性 K 转换为必选的属性。

 默认情况下会将 T 的所以属性都转为必选。

 @template T - 要转换的类型。

 @template K - 要转换为必选的属性。
 */
export type Required<T, K extends keyof T = keyof T> = T & {[P in K]-?: T[P]};

/**
 创建一个字面联合类型，即包含指定的字面量类型，又兼容基础原始类型。

 用于提供精确类型提示的同时，保持一定的灵活性。

 @template LiteralType - 字面量类型。

 @template BaseType - 基础原始类型。

 @returns 联合类型：LiteralType | 其他 BaseType 类型的值。
 */
export type LiteralUnion<LiteralType extends BaseType, BaseType extends Primitive> =
	| LiteralType
	| (BaseType & {_?: never});